#include "registerwin.h"
#include "ui_registerwin.h"
#include <QFileDialog>
#include <QDate>
#include <QDateTime>
#include <QMessageBox>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>
#include <QDir>
#include <QStandardPaths>
#include <QCoreApplication>
#include "qfaceobject.h"
#include <opencv2/opencv.hpp>
#include <seeta/FaceEngine.h>
#include <QSqlTableModel>
#include <QSqlRecord>
Registerwin::Registerwin(QWidget *parent)
    : QWidget(parent), ui(new Ui::Registerwin)
{
    ui->setupUi(this);
    timer = new QTimer(this);
    connect(timer, &QTimer::timeout, this, &Registerwin::updateFrame);
}

Registerwin::~Registerwin()
{
    if (cap.isOpened())
    {
        cap.release();
    }
    delete ui;
}

void Registerwin::on_resetBt_clicked()
{
    ui->nameEdit->clear();
    ui->birthdayEdit->setDate(QDate(2000, 1, 1));
    ui->addressEdit->clear();
    ui->phoneEdit->clear();
    ui->picFileEdit->clear();
    ui->headpicLb->clear();
    ui->mrb->setChecked(false);
    ui->wrb->setChecked(false);
}

void Registerwin::on_registerBt_clicked()
{
    // 1.通过照片，结合faceObject模块得到faceID
    QFaceObject faceobj;
    cv::Mat image = cv::imread(ui->picFileEdit->text().toUtf8().data());
    // int faceID = faceobj.face_register(image);
    // qDebug() << faceID;

    // 检查图像是否为空
    if (image.empty())
    {
        QMessageBox::warning(this, "错误", "图像为空，无法注册");
        return;
    }

    int faceID = faceobj.face_register(image);
    // 检查注册结果
    if (faceID < 0)
    {
        QMessageBox::warning(this, "注册失败", "该人脸已存在，无法重复注册！");
        return;
    }
    // 创建headpic目录（如果不存在）
    QDir dir;
    QString headpicDir = QCoreApplication::applicationDirPath() + "/headpic";
    if (!dir.exists(headpicDir))
    {
        dir.mkpath(headpicDir);
    }

    // 把头像保存到当前目录下的headpic文件夹
    // 使用时间戳避免中文文件名问题
    QString timestamp = QString::number(QDateTime::currentMSecsSinceEpoch());
    QString headfile = QString("%1/%2_%3.jpg")
                           .arg(headpicDir)
                           .arg(timestamp)
                           .arg(faceID);

    qDebug() << "准备保存头像到:" << headfile;
    qDebug() << "图像尺寸:" << image.cols << "x" << image.rows;
    qDebug() << "图像通道数:" << image.channels();

    // 检查图像是否为空
    if (image.empty())
    {
        QMessageBox::warning(this, "错误", "图像为空，无法保存");
        qDebug() << "错误：图像为空";
        // 不要return，继续保存数据库记录
    }
    else
    {
        // 保存图像并检查是否成功
        bool saveResult = cv::imwrite(headfile.toStdString(), image);
        qDebug() << "图像保存结果:" << saveResult;
        
        if (!saveResult)
        {
            qDebug() << "警告：无法保存头像文件到" << headfile;
            // 不要return，继续保存数据库记录
        }
        else
        {
            qDebug() << "头像保存成功:" << headfile;
        }
    }

    // 2.把个人信息存储到数据库employee
    // 确保数据库连接存在
    QSqlDatabase db = QSqlDatabase::database();
    if (!db.isValid() || !db.isOpen()) {
        qDebug() << "数据库连接无效，尝试重新连接";
        db = QSqlDatabase::addDatabase("QSQLITE");
        QString dbPath = QCoreApplication::applicationDirPath() + "/sever.db";
        db.setDatabaseName(dbPath);
        qDebug() << "Registerwin类数据库路径:" << dbPath;
        if (!db.open()) {
            QMessageBox::warning(this, "数据库错误", "无法连接到数据库: " + db.lastError().text());
            return;
        }
    }
    
    QSqlTableModel model(this, db);
    model.setTable("employee"); // 设置表名
    
    if (!model.select()) {
        QMessageBox::warning(this, "数据库错误", "无法访问employee表: " + model.lastError().text());
        return;
    }
    
    QSqlRecord record = model.record();
    // 设置数据
    record.setValue("name", ui->nameEdit->text());
    record.setValue("sex", ui->mrb->isChecked() ? "男" : "女");
    record.setValue("birthday", ui->birthdayEdit->text());
    record.setValue("address", ui->addressEdit->text());
    record.setValue("phone", ui->phoneEdit->text());
    record.setValue("faceID", faceID);
    // 头像路径（使用相对路径）
    QString relativeHeadfile = QString("headpic/%1_%2.jpg")
                                   .arg(timestamp)
                                   .arg(faceID);
    record.setValue("headfile", relativeHeadfile);
    
    qDebug() << "准备写入数据库记录:";
    qDebug() << "姓名:" << ui->nameEdit->text();
    qDebug() << "性别:" << (ui->mrb->isChecked() ? "男" : "女");
    qDebug() << "生日:" << ui->birthdayEdit->text();
    qDebug() << "地址:" << ui->addressEdit->text();
    qDebug() << "电话:" << ui->phoneEdit->text();
    qDebug() << "人脸ID:" << faceID;
    qDebug() << "头像文件:" << relativeHeadfile;
    // 把记录插入到数据库表格中
    bool ret = model.insertRecord(0, record);
    // 3.提示注册成功
    if (ret)
    {
        if (model.submitAll()) {
            QMessageBox::information(this, "注册提示", "注册成功");
        } else {
            QMessageBox::warning(this, "注册提示", "提交失败: " + model.lastError().text());
        }
    }
    else
    {
        QMessageBox::warning(this, "注册提示", "注册失败: " + model.lastError().text());
    }
}

void Registerwin::on_addpicBt_clicked()
{
    QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "", tr("Image Files (*.png *.jpg *.bmp)"));
    if (!fileName.isEmpty())
    {
        ui->picFileEdit->setText(fileName);
    }

    QPixmap pixmap(fileName);
    ui->headpicLb->setPixmap(pixmap);
    ui->headpicLb->setScaledContents(true);
}

void Registerwin::on_videoBt_clicked()
{
    if (!timer->isActive())
    {
        // 启动摄像头
        if (!cap.isOpened())
        {
            cap.open(0);
            cascade.load("E:/code/Qtproject/package/opencv452/etc/haarcascades/haarcascade_frontalface_alt2.xml");
        }
        if (cap.isOpened())
        {
            timer->start(30); // 每30毫秒更新一次，约33fps
            ui->videoBt->setText("停止视频");
        }
    }
    else
    {
        // 停止摄像头
        timer->stop();
        cap.release();
        ui->videoBt->setText("开启视频");
        ui->headpicLb->clear();
    }
}

void Registerwin::on_cameraBt_clicked()
{
    // 确保摄像头已打开
    if (!cap.isOpened())
    {
        cap.open(0);
    }

    if (cap.isOpened())
    {
        Mat srcImage;
        // 捕获当前帧
        if (cap.read(srcImage))
        {
            // 转换BGR到RGB用于显示
            Mat displayImage;
            cv::cvtColor(srcImage, displayImage, cv::COLOR_BGR2RGB);

            // 创建QImage并转换为QPixmap用于显示
            QImage image(displayImage.data, displayImage.cols, displayImage.rows, displayImage.step1(), QImage::Format_RGB888);
            QPixmap pixmap = QPixmap::fromImage(image);

            // 显示到头像标签，保持比例缩放
            ui->headpicLb->setPixmap(pixmap.scaled(ui->headpicLb->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation));
            ui->headpicLb->setScaledContents(true);

            // *** 关键修改：保存拍照图片为临时文件 ***
            QString tempDir = QCoreApplication::applicationDirPath() + "/temp";
            QDir dir;
            if (!dir.exists(tempDir))
            {
                dir.mkpath(tempDir);
            }
            
            QString tempFileName = tempDir + "/camera_capture.jpg";
            // 保存原始BGR图像（不是转换后的RGB）
            if (cv::imwrite(tempFileName.toUtf8().data(), srcImage))
            {
                // 设置文件路径到编辑框
                ui->picFileEdit->setText(tempFileName);
                qDebug() << "拍照图片已保存到:" << tempFileName;
            }
            else
            {
                QMessageBox::warning(this, "错误", "无法保存拍照图片");
            }

            // 拍照后停止视频播放
            if (timer->isActive())
            {
                timer->stop();
                ui->videoBt->setText("开启视频");
            }

            // 释放摄像头资源
            cap.release();
        }
    }
}

void Registerwin::updateFrame()
{
    Mat srcImage;
    if (cap.isOpened() && cap.read(srcImage))
    {
        // 转换BGR到RGB
        cv::cvtColor(srcImage, srcImage, cv::COLOR_BGR2RGB);

        // 创建QImage
        QImage image(srcImage.data, srcImage.cols, srcImage.rows, srcImage.step1(), QImage::Format_RGB888);
        QPixmap pixmap = QPixmap::fromImage(image);

        // 设置到标签上，保持比例缩放
        ui->headpicLb->setPixmap(pixmap.scaled(ui->headpicLb->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation));
    }
}
